home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / dev / m2 / Turbo_1.lha / modula / amiga / TrackDisk.def < prev    next >
Text File  |  1994-11-08  |  7KB  |  189 lines

  1. DEFINITION FOR AMIGALIB MODULE TrackDisk ;
  2.  
  3. FROM SYSTEM IMPORT SHORTSET ;
  4. FROM Exec   IMPORT CMD_NONSTD, CMD_READ, CMD_WRITE, CMD_CLEAR, CMD_UPDATE,
  5.            Unit, IOStdReq ;
  6.  
  7. CONST
  8.  
  9. (* Physical drive constants *)
  10.   NUMSECS    = 11 ;
  11.   NUMUNITS    = 4  ;
  12.  
  13. (* Useful constants *)
  14.  
  15. (* sizes before mfm encoding *)
  16.   TD_SECTOR    = 512 ;
  17.   TD_SECSHIFT    = 9   ;     (* log TD_SECTOR *)
  18.  
  19. (* TD_NAME is a generic macro to get the name of the driver. This         *)
  20. (* way if the name is ever changed you will pick up the change automatically *)
  21.  
  22.   TD_NAME    = "trackdisk.device";
  23.  
  24.   TDF_EXTCOM    = LONGINT({15}) ;        (* for internal use only! *)
  25.  
  26. (* Driver Specific Commands *)
  27.  
  28.   TD_MOTOR        = CMD_NONSTD+0  ;(* control the disk's motor          *)
  29.   TD_SEEK        = CMD_NONSTD+1  ;(* explicit seek (for testing)          *)
  30.   TD_FORMAT        = CMD_NONSTD+2  ;(* format disk                  *)
  31.   TD_REMOVE        = CMD_NONSTD+3  ;(* notify when disk changes          *)
  32.   TD_CHANGENUM        = CMD_NONSTD+4  ;(* number of disk changes          *)
  33.   TD_CHANGESTATE    = CMD_NONSTD+5  ;(* is there a disk in the drive?     *)
  34.   TD_PROTSTATUS        = CMD_NONSTD+6  ;(* is the disk write protected?      *)
  35.   TD_RAWREAD        = CMD_NONSTD+7  ;(* read raw bits from the disk       *)
  36.   TD_RAWWRITE        = CMD_NONSTD+8  ;(* write raw bits to the disk          *)
  37.   TD_GETDRIVETYPE    = CMD_NONSTD+9  ;(* get the type of the disk drive    *)
  38.   TD_GETNUMTRACKS    = CMD_NONSTD+10 ;(* # of tracks for this type drive   *)
  39.   TD_ADDCHANGEINT    = CMD_NONSTD+11 ;(* TD_REMOVE done right          *)
  40.   TD_REMCHANGEINT    = CMD_NONSTD+12 ;(* remove softint set by ADDCHANGEINT*)
  41.   TD_GETGEOMETRY    = CMD_NONSTD+13 ;(* gets the disk geometry table      *)
  42.   TD_EJECT        = CMD_NONSTD+14 ;(* for those drives that support it  *)
  43.   TD_LASTCOMM        = CMD_NONSTD+15 ;
  44.  
  45. (* The disk driver has an "extended command" facility.These commands    *)
  46. (* take a superset of the normal IO Request block.            *)
  47.  
  48.   ETD_WRITE    = CMD_WRITE    + TDF_EXTCOM ;
  49.   ETD_READ    = CMD_READ    + TDF_EXTCOM ;
  50.   ETD_MOTOR    = TD_MOTOR    + TDF_EXTCOM ;
  51.   ETD_SEEK    = TD_SEEK    + TDF_EXTCOM ;
  52.   ETD_FORMAT    = TD_FORMAT    + TDF_EXTCOM ;
  53.   ETD_UPDATE    = CMD_UPDATE    + TDF_EXTCOM ;
  54.   ETD_CLEAR    = CMD_CLEAR    + TDF_EXTCOM ;
  55.   ETD_RAWREAD    = TD_RAWREAD    + TDF_EXTCOM ;
  56.   ETD_RAWWRITE    = TD_RAWWRITE    + TDF_EXTCOM ;
  57.  
  58. (* extended IO has a larger than normal io request block *)
  59.  
  60. TYPE
  61.     IOExtTDPtr = POINTER TO IOExtTD ;
  62.     IOExtTD = RECORD
  63.     iotd_Req    : IOStdReq ;
  64.     iotd_Count    : LONGINT  ;
  65.     iotd_SecLabel    : LONGINT  ;
  66.     END ;
  67.  
  68. (*
  69.  *  This is the structure returned by TD_DRIVEGEOMETRY
  70.  *  Note that the layout can be defined three ways:
  71.  *
  72.  *  1. TotalSectors
  73.  *  2. Cylinders and CylSectors
  74.  *  3. Cylinders, Heads, and TrackSectors.
  75.  *
  76.  *  #1 is most accurate, #2 is less so, and #3 is least accurate.  All
  77.  *  are usable, though #2 and #3 may waste some portion of the available
  78.  *  space on some drives.
  79.  *)
  80.  
  81.   DriveGeometryPtr = POINTER TO DriveGeometry ;
  82.   DriveGeometry = RECORD
  83.     dg_SectorSize   : LONGINT ;      (* in bytes                 *)
  84.     dg_TotalSectors : LONGINT ;      (* total # of sectors on drive     *)
  85.     dg_Cylinders    : LONGINT ;      (* number of cylinders         *)
  86.     dg_CylSectors   : LONGINT ;      (* number of sectors/cylinder         *)
  87.     dg_Heads        : LONGINT ;      (* number of surfaces             *)
  88.     dg_TrackSectors : LONGINT ;      (* number of sectors/track         *)
  89.     dg_BufMemType   : LONGINT ;      (* preferred buffer memory type     *)
  90.                   (* (usually MEMF_PUBLIC)         *)
  91.     dg_DeviceType   : SHORTCARD ; (* codes as defined in the SCSI-2 spec *)
  92.     dg_Flags        : SHORTSET  ; (* flags, including removable         *)
  93.     dg_Reserved        : CARDINAL  ;
  94.   END ;
  95.  
  96. (* device types *)
  97.  
  98. CONST
  99.   DG_DIRECT_ACCESS    = 0 ;
  100.   DG_SEQUENTIAL_ACCESS    = 1 ;
  101.   DG_PRINTER        = 2 ;
  102.   DG_PROCESSOR        = 3 ;
  103.   DG_WORM        = 4 ;
  104.   DG_CDROM        = 5 ;
  105.   DG_SCANNER        = 6 ;
  106.   DG_OPTICAL_DISK    = 7 ;
  107.   DG_MEDIUM_CHANGER    = 8 ;
  108.   DG_COMMUNICATION    = 9 ;
  109.   DG_UNKNOWN        = 31;
  110.  
  111. (* flags *)
  112.   DGB_REMOVABLE        =  0  ;
  113.   DGF_REMOVABLE        = {0} ;
  114.  
  115. CONST
  116. (* raw read and write can be synced with the index pulse.  This flag  *)
  117. (* in io request's IO_FLAGS field tells the driver that you want this.*)
  118.  
  119.   IOTDB_INDEXSYNC    =  4  ;
  120.   IOTDF_INDEXSYNC    = {4} ;
  121.  
  122. (* labels are TD_LABELSIZE bytes per sector *)
  123.  
  124.   TD_LABELSIZE    = 16 ;
  125.  
  126. (* This is a bit in the FLAGS field of OpenDevice.  If it is set, then    *)
  127. (* the driver will allow you to open all the disks that the trackdisk    *)
  128. (* driver understands.    Otherwise only 3.5" disks will succeed.        *)
  129.  
  130.   TDB_ALLOW_NON_3_5    =  0  ;
  131.   TDF_ALLOW_NON_3_5    = {0} ;
  132.  
  133. (*  If you set the TDB_ALLOW_NON_3_5 bit in OpenDevice, then you don't    *)
  134. (*  know what type of disk you really got.  These defines are for the    *)
  135. (*  TD_GETDRIVETYPE command.  In addition, you can find out how many    *)
  136. (*  tracks are supported via the TD_GETNUMTRACKS command.        *)
  137.  
  138.   DRIVE3_5        = 1 ;
  139.   DRIVE5_25        = 2 ;
  140.   DRIVE3_5_150RPM    = 3 ;
  141.  
  142. (* Driver error defines *)
  143.  
  144.   TDERR_NotSpecified    = 20 ;    (* general catchall            *)
  145.   TDERR_NoSecHdr    = 21 ;    (* couldn't even find a sector        *)
  146.   TDERR_BadSecPreamble    = 22 ;    (* sector looked wrong            *)
  147.   TDERR_BadSecID    = 23 ;    (* ditto                *)
  148.   TDERR_BadHdrSum    = 24 ;    (* header had incorrect checksum    *)
  149.   TDERR_BadSecSum    = 25 ;    (* data had incorrect checksum         *)
  150.   TDERR_TooFewSecs    = 26 ;    (* couldn't find enough sectors        *)
  151.   TDERR_BadSecHdr    = 27 ;    (* another "sector looked wrong"    *)
  152.   TDERR_WriteProt    = 28 ;    (* can't write to a protected disk    *)
  153.   TDERR_DiskChanged    = 29 ;    (* no disk in the drive            *)
  154.   TDERR_SeekError    = 30 ;    (* couldn't find track 0        *)
  155.   TDERR_NoMem        = 31 ;    (* ran out of memory            *)
  156.   TDERR_BadUnitNum    = 32 ;    (* asked for a unit > NUMUNITS        *)
  157.   TDERR_BadDriveType    = 33 ;    (* not a drive that trackdisk groks    *)
  158.   TDERR_DriveInUse    = 34 ;    (* someone else allocated the drive    *)
  159.   TDERR_PostReset    = 35 ;    (* user hit reset; awaiting doom    *)
  160.  
  161. (* public portion of the unit structure *)
  162.  
  163. TYPE
  164.   TDU_PublicUnitPtr = POINTER TO TDU_PublicUnit ;
  165.   TDU_PublicUnit = RECORD
  166.     tdu_Unit        : Unit ;    (* base message port              *)
  167.     tdu_Comp01Track    : CARDINAL ;    (* track for first precomp          *)
  168.     tdu_Comp10Track    : CARDINAL ;    (* track for second precomp          *)
  169.     tdu_Comp11Track    : CARDINAL ;    (* track for third precomp          *)
  170.     tdu_StepDelay    : LONGINT ;    (* time to wait after stepping          *)
  171.     tdu_SettleDelay    : LONGINT ;    (* time to wait after seeking          *)
  172.     tdu_RetryCnt    : SHORTCARD ;    (* # of times to retry              *)
  173.     tdu_PubFlags    : SHORTSET ;    (* public flags, see below          *)
  174.     tdu_CurrTrk        : CARDINAL ;    (* track the heads are over...          *)
  175.                     (* ONLY ACCESS WHILE UNIT IS STOPPED! *)
  176.     tdu_CalibrateDelay    : LONGINT ;    (* time to wait after stepping          *)
  177.                     (* during a recalibrate              *)
  178.     tdu_Counter        : LONGINT ;    (* counter for disk changes...          *)
  179.                     (* ONLY ACCESS WHILE UNIT IS STOPPED! *)
  180.   END ;
  181.  
  182. (* flags for tdu_PubFlags *)
  183.  
  184. CONST
  185.   TDPB_NOCLICK    =  0  ;
  186.   TDPF_NOCLICK    = {0} ;
  187.  
  188. END TrackDisk.
  189.